package com.example.vue3.tess4j;

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.util.ImageIOHelper;

import javax.imageio.IIOImage;
import java.io.File;
import java.net.URLDecoder;
import java.util.List;

/**
 * Java 使用 tess4j 识别图片上的文字
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2022/11/6 17:31
 */
@SuppressWarnings("Duplicates")
public class Tess4jUtils {

    public static void main(String[] args) throws Exception {
        // testReadImg2Text();
        testReadPDF2Text();
    }

    public static void testReadImg2Text() throws Exception {
        String path = Tess4jUtils.class.getClassLoader().getResource("static/images/微信截图_20221106171138.png").getPath();
        // String path = Tess4jUtils.class.getClassLoader().getResource("static/images/logo.png").getPath();
        // String path = Tess4jUtils.class.getClassLoader().getResource("static/images/eurotext_unlv.png").getPath();
        path = URLDecoder.decode(path, "utf-8");
        File file = new File(path);
        String readImg2Text = readImg2Text(file);
        System.out.println("-------------readImg2Text---------------------");
        System.out.println(readImg2Text);
    }

    public static void testReadPDF2Text() throws Exception {
        // String path = Tess4jUtils.class.getClassLoader().getResource("static/images/eurotext.pdf").getPath();
        String path = Tess4jUtils.class.getClassLoader().getResource("static/images/Markdown 基本语法.pdf").getPath();
        path = URLDecoder.decode(path, "utf-8");
        File file = new File(path);
        String readImg2Text = readPDF2Text(file);
        System.out.println("-------------readPDF2Text---------------------");
        System.out.println(readImg2Text);
    }

    /**
     * 读取图片中的文字(中英文都OK)
     *
     * @param file ：图片文件
     * @return ：返回读取好的文字信息
     * @throws Exception
     */
    public static final String readImg2Text(File file) throws Exception {
        // 读取中文字体库目录(datapath)，目录下面需要提取存放好字体库文件(chi_sim.traineddata)
        String dataPath = Tess4jUtils.class.getClassLoader().getResource("tessdata").getPath();
        File dataFile = new File(dataPath);
        // 创建 Tesseract 对象
        ITesseract tesseract = new Tesseract();
        // 设置语种目录(其中包含指定语言语种文件 .traineddata)
        tesseract.setDatapath(dataFile.getAbsolutePath());
        // 设置OCR的语言(不显示指定时，默认使用语种目录下的 eng.traineddata 英文语种.)（只需要文件名，不需要后缀名）
        // tesseract.setLanguage("chi_sim");
        tesseract.setLanguage("chi_sim2");
        // 执行ocr识别
        String result = tesseract.doOCR(file);
        return result;
    }

    /**
     * 识别整个 pdf 文件中的文字
     *
     * @param pdfFile
     * @return
     * @throws Exception
     */
    public static final String readPDF2Text(File pdfFile) throws Exception {
        // 读取中文字体库目录(datapath)，目录下面需要提取存放好字体库文件(chi_sim.traineddata)
        String dataPath = Tess4jUtils.class.getClassLoader().getResource("tessdata").getPath();
        File dataFile = new File(dataPath);
        // 创建 Tesseract 对象
        ITesseract tesseract = new Tesseract();
        // 设置语种目录(其中包含指定语言语种文件 .traineddata)
        tesseract.setDatapath(dataFile.getAbsolutePath());
        // 设置OCR的语言(不显示指定时，默认使用语种目录下的 eng.traineddata 英文语种.)
        // tesseract.setLanguage("chi_sim");
        tesseract.setLanguage("chi_sim2");
        List<IIOImage> imageList = ImageIOHelper.getIIOImageList(pdfFile);
        String result = tesseract.doOCR(imageList, null);
        return result;
    }

}
